/*
1:下载axios
2:导入axios
3:设置axios(创建一个axios副本)
4：设置axios的请求拦截与响应拦截
5：暴露出去
6：src/api/xxx.js导入使用
*/
import axios from 'axios'
// 基地址处理：使用环境变化
// 环境变量：
// 开发环境：npm run dev/serve
/*
根目录创建.env.development文件
设置变量：要求：VUE_APP_开头  VUE_APP_URL='xxx'
访问变量:process.env.VUE_APP_URL
    */
/*
自定义环境
  根目录创建.env.xxx文件
  设置变量：要求：VUE_APP_开头  VUE_APP_URL='xxx'
  访问变量:process.env.VUE_APP_URL
  配制package.json
     "build:xxx": "vue-cli-service build --mode xxx",
*/
// 生产环境: npm run build
/*
根目录创建.env.production文件
设置变量：要求：VUE_APP_开头  VUE_APP_URL='xxx'
访问变量:process.env.VUE_APP_URL
    */

const _axios = axios.create({
  //   baseURL: 'http://119.91.150.211:3000/api'  开发
  //   baseURL: 'http://ihrm-java.itheima.net/api' // 生产
  // 环境变量控制基地址
  baseURL: process.env.VUE_APP_URL
})
let allApi = []
// 取消所有请求
export const cancelAll = () => {
  // console.log(cancelAll)
  allApi = allApi.filter(item => {
    item.cancel()
    return false
  })
}

_axios.interceptors.request.use(
  config => {
    // 设置请求头(token)
    // 接口需要token
    // 接口不需要token
    // 不需要token加了不报错
    // config.headers.Authorization = `Bearer ${localStorage.getItem('token')}`
    // 不需要token加了报错
    // console.log('config', config)
    if (!config.noToken) {
      config.headers.Authorization = `Bearer ${localStorage.getItem('token')}`
    }
    // 调用上一次的取消方法
    allApi = allApi.filter(item => {
      if (item.url === config.url && item.method === config.method) {
        item.cancel()
        return false
      }
      return true
    })

    // 存储此次的取消方法
    if (!config.noCancel) {
      config.cancelToken = new axios.CancelToken(cancel => {
        // 取消请求
        allApi.push({
          url: config.url,
          method: config.method,
          cancel: cancel
        })
      })
    }
    // 统一参数添加
    const other = config.url.includes('?') ? '&' : '?'
    config.url = config.url + other + 'lang=en'

    return config
  },
  error => {
    return Promise.reject(error)
  }
)
// 统一错误处理
// token失效处理
_axios.interceptors.response.use(
  // 请求成功：状态码以2开头
  res => {
    if (res.data.success) {
      return res
    } else {
      // 提示错误
      alert(res.data.message)
      // 抛出错误，中止后面.then执行,执行了.catch
      return Promise.reject(res.data.message)
    }
  },
  // 请求失败：状态码是非2开头
  error => {
    // 401:删除token与用户信息，提示，跳转到登陆页
    console.log('error:', error)
    if (error.response && error.response.status === 401) {
      localStorage.removeItem('token')
      alert('登录过期了，请重新登录')
      console.log('error:跳转到登录')
    }
    return Promise.reject(error)
  }
)
export default _axios
